package jvm;

import java.util.Map;
import java.util.WeakHashMap;

public class JvmTest {
	
	public static void main(String[] args) {
		//memoryAllocationTest();
		//minorGCTest();
		fullGCTest();
	}
	
	/**
	 * 内存分配测试
	 * 
	 * 堆内存30M（年轻代：10M（Eden：8M From：1M To：1M）；老年代：20M）
	 * 永久代：10M
	 * 栈内存：256K
	 * 
	 * 启动参数设置：
	 * -Xms	初始堆内存
	 * -Xmx	最大堆内存
	 * -Xss	线程栈大小
	 * -Xmn	年轻代大小
	 * -XX:SurvivorRatio=8	年轻代中Eden区与Survivor区的比值
	 * -XX:NewSize=10m	永久代初始值
	 * -XX:MaxNewSize=10m	永轻代最大值
	 * -XX:MaxTenuringThreshold=15	一个对象如果在Survivor区移动了7次还没有被垃圾回收就进入年老代
	 * 
	 * -Xms30m -Xmx30m -Xss256k -Xmn10m -XX:SurvivorRatio=8 -XX:NewSize=10m -XX:MaxNewSize=10m -XX:MaxTenuringThreshold=15
	 * 
	 * jmap -heap pid 查看内存分配信息
	 */
	public static void memoryAllocationTest() {
		System.out.println("TEST");
		
		try {
			Thread.sleep(1000*1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	
	
	/**
	 * GC测试：minor gc
	 * 
	 * 堆内存30M（年轻代：10M（Eden：8M From：1M To：1M）；老年代：20M）
	 * 永久代：10M
	 * 栈内存：256K
	 * 
	 * -Xms30m -Xmx30m -Xss256k -Xmn10m -XX:SurvivorRatio=8 -XX:NewSize=10m -XX:MaxNewSize=10m -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
	 * 
	 * -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 打印GC信息
	 */
	public static void minorGCTest() {
		byte[] _512K = new byte[512*1024];
		byte[] _2M = new byte[2*1024*1024];
		for(int i=0;i<30;i++) {
			_512K = new byte[512*1024];
			System.out.println(i);
		}
		byte[] _10M = new byte[10*1024*1024];
	}
	
	/**
	 * GC测试：full gc
	 * 
	 * 堆内存30M（年轻代：10M（Eden：8M From：1M To：1M）；老年代：20M）
	 * 永久代：10M
	 * 栈内存：256K
	 * 
	 * -Xms30m -Xmx30m -Xss256k -Xmn10m -XX:SurvivorRatio=8 -XX:NewSize=10m -XX:MaxNewSize=10m -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
	 * 
	 * -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 打印GC信息
	 */
	public static void fullGCTest() {
		Map<Object, Object> map = new WeakHashMap<>();
		for(int i=0;i<50;i++) {
			map.put(new byte[512*1024], new byte[512*1024]);
			System.out.println(i);
		}
	}
}